#include <alt_types.h>
#include "eth_tx.h"
#include <eth_tx_regs.h>

//! Адрес аппаратного модуля.
static alt_u32 	base_addr;


alt_u8 eth_tx_init(alt_u32 addr)
{
	base_addr = addr;
	return 0;
}

alt_u8 eth_tx_reset()
{
	alt_u8 err = 0;

	// Команда сброс
	IOWR_ETH_TX_CTRL(base_addr, 1 << ETH_TX_CTRL_CMD_OFST);
	return err;
}

alt_u8 eth_tx_set_size(alt_u32 size)
{
	// Запись размера
	IOWR_ETH_TX_DATASZ(base_addr, size & ETH_TX_DATASZ_MSK);

	return 0;
}

alt_u8 eth_tx_set_smac(alt_u64 mac)
{
	IOWR_ETH_TX_SMACL(base_addr, mac & ETH_TX_SMACL_MSK);
	IOWR_ETH_TX_SMACH(base_addr, (mac >> 32) & ETH_TX_SMACH_MSK);
	return 0;
}

alt_u8 eth_tx_set_dmac(alt_u64 mac)
{
	IOWR_ETH_TX_DMACL(base_addr, mac & ETH_TX_DMACL_MSK);
	IOWR_ETH_TX_DMACH(base_addr, (mac >> 32) & ETH_TX_DMACH_MSK);
	return 0;
}

alt_u8 eth_tx_set_etype(alt_u16 etype)
{
	IOWR_ETH_TX_ETYPE(base_addr, etype & ETH_TX_ETYPE_MSK);
	return 0;
}

alt_u8 eth_tx_send(alt_u32 addr, alt_u16 size)
{
	alt_u8 				err = 0;
	eth_tx_status_reg_t status;

	if ((size > 0) && (size < 1500))
	{
		// Если передатчик не занят, можно сменить размер пакета
		status.data = IORD_ETH_TX_STATUS(base_addr);
		if (!status.busy)
		{
			// Запись размера
			IOWR_ETH_TX_DATASZ(base_addr, size & ETH_TX_DATASZ_MSK);
			// Устанавливаем адрес данных
			IOWR_ETH_TX_DATADDR(base_addr, addr);
			// Команда запуска
			IOWR_ETH_TX_CTRL(base_addr, 2 << ETH_TX_CTRL_CMD_OFST);
		}
		else
		{
			err = 1;
		}
	}
	else
	{
		err = 2;
	}

	return err;
}


// Получить состояние передатчика
alt_u8 eth_tx_get_state()
{
	alt_u8 				err = 0;
	eth_tx_status_reg_t status;

	// Получим статус передатчика, и если он занят, ошибка
	status.data = IORD_ETH_TX_STATUS(base_addr);
	if (status.busy)
	{
		err = 1;
	}

	return err;
}
